package org.loginplugin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.session.SqlSession;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.loginplugin.config.SqlSessionConfig;
import org.loginplugin.entity.LoginData;
import org.jetbrains.annotations.NotNull;
import org.loginplugin.entity.User;
import org.loginplugin.mapper.UserMapper;

import javax.annotation.ParametersAreNonnullByDefault;

import static org.loginplugin.LoginPlugin.SQL_SESSION;

/**
 * 命令逻辑处理
 */
public class Commander implements CommandExecutor {

    /**
     * @param sender
     * @param command
     * @param label
     * @param args    参数数量
     * @return
     */
    @Override
    @ParametersAreNonnullByDefault
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
        if (!(sender instanceof Player)) {
            // 如果 sender 是 Player 的实例，那么这条命令是玩家发送的，反之则不是
            return false;
            // 服主也有可能从服务器控制台使用命令，先确认命令来自于玩家
        }

        if (!LoginData.hasPlayerName(sender.getName())) {
            sender.sendMessage(ChatColor.GREEN + "你已经登录了！");
            return true;
            // 已经登录了，就没必要验证了
        }

        if (args.length == 0) {
            sender.sendMessage(ChatColor.RED + "必须输入密码！");
            // sendMessage 用于向该终端（玩家或控制台）发送消息
            return false;
            // 参数不完整，拒绝处理
        }

        //玩家的密码可能含有空格，join 将它们粘在一起，<space > 只是定义的分隔符，换成别的也行
        String pwdConcat = String.join("<space>", args);

        try {
            UserMapper userMapper = SQL_SESSION.getMapper(UserMapper.class);
            User user = userMapper.selectOne(new QueryWrapper<User>().eq("user_name", sender.getName()));

            //没有注册过
            if (user == null) {
                // 玩家没注册，准备注册
                User registerUser = new User();
                registerUser.setUserName(sender.getName());
                registerUser.setUserPassword(pwdConcat);
                int userInsert = userMapper.insert(registerUser);
                if (userInsert == 1) {
                    // 注册玩家
                    LoginData.removePlayerName(sender.getName());
                    // 解锁玩家
                    sender.sendMessage(ChatColor.GREEN + "注册成功！");
                    return true;
                } else {
                    sender.sendMessage(ChatColor.GREEN + "注册失败！");
                    return true;
                }
            } else {
                // 已经注册
                if (user.getUserPassword().equals(pwdConcat)) {
                    // 验证密码
                    LoginData.removePlayerName(sender.getName());
                    // 解锁玩家
                    sender.sendMessage(ChatColor.GREEN + "登录成功，欢迎回来！");
                } else {
                    sender.sendMessage(ChatColor.RED + "密码错误！");
                }
                return true;
            }

        } catch (Exception e) {
            //意料之外的错误
            e.printStackTrace();
            return false;
        }
    }
}
